/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg1ifxServidorTcp;

import java.net.*;
import java.io.*;

import pkg1ifxArchivos.cifxLogs;
/**
 *
 * @author strailaparicio
 */
//public class cIfxServidor
public class cIfxServidor extends Thread{
    //Puerto en el FNA es el 20212 - 20152
    protected  int npuerto = 9623; //El puerto por defecto es el 9623 IFX 
    protected ServerSocket serversocket = null;
    protected boolean bdesconectar= false;
    //private frmPpal ofrmppal = null;
    //private frmGRal ofrmgral = null;
    protected cIfxClientesCon[] oclientescon = new cIfxClientesCon[0];//=new cIfxClientesCon[150];
    protected cIfxClientesCon[] oagentesTMP;
    protected int ncontadorclientes=0;
    protected int nagentesllave=0;
    protected static cifxLogs olog=new cifxLogs();
    protected int nindice=0;
    protected boolean conectado=true;
    protected int ntimeout = 0;
    protected String sSO= System.getProperty("os.name");

    public cIfxServidor(int npuerto,cifxLogs log) throws IOException
    {
        //ServerSocket serversocket = null;
        if(npuerto > 0)
            this.npuerto = npuerto;

        olog=log;
        
    }

    
    public cIfxClientesCon[] getAgentesConectados()
    {
        return oclientescon;
    }

    //public void RouterConexion(frmGRal ofrmppal) throws IOException{
    //public void RouterConexion() throws IOException{
    @Override
    public void run() {
        Socket onuevoskt=null;
        
        //int nindice=0;
        
        try
        {
          serversocket = new ServerSocket(npuerto);

        }catch(IOException ioe)
        {
            //System.err.println("001IFX-Error (No puedo abri el puerto"+npuerto+")");
            olog.outMensaje("cIfxServidor.run(): ERROR No puedo abrir el puerto :"+npuerto);
            olog.outMensaje("cIfxServidor.run(): ERROR IOException :"+ioe.getMessage());
            System.exit(-1);
        }

        //this.ofrmgral = ofrmppal;
        //ofrmgral.setIconRed(3);
        try {
            while(conectado)
            {

                    //new cIfxClientesCon(serversocket.accept(),ofrmppal).start();
                onuevoskt= serversocket.accept();
                //Asigno un time out de 10 segundos a las conexiones
                onuevoskt.setSoTimeout(ntimeout);
                activarConexionCliente(onuevoskt);

               
            }
            if(serversocket != null)
                serversocket.close();
        } 
        catch(SocketTimeoutException tex)
        {
            olog.outMensaje("cIfxServidor.run(): Time out :"+tex.getMessage());
        }
        catch (IOException ex) {
                //Logger.getLogger(cIfxServidor.class.getName()).log(Level.SEVERE, null, ex);
            olog.outMensaje("cIfxServidor.run(): ERROR IOException :"+ex.getMessage());
        }
    }
    public void setTimeOut(int dato)
    {
        
            ntimeout=dato;
    }
    public int getTimeOut()
    {
        return ntimeout;
    }
    /**
     * 
     * @param destino
     * @param origen 
     */
    public synchronized void CopiarArregloCon(cIfxClientesCon[] destino,cIfxClientesCon[] origen)
    {
        
        //cIfxClientesCon occtmp[] = new cIfxClientesCon[occon.length];
        System.arraycopy(origen, 0, destino, 0, origen.length);
    
    }
    private synchronized void activarConexionCliente(Socket onuevoskt)
    {
        try
        {
            cIfxClientesCon[] occontmp=new cIfxClientesCon[0];
            occontmp=new cIfxClientesCon[oclientescon.length];
            CopiarArregloCon(occontmp,oclientescon);
            //occontmp= CopiarArregloCon(oclientescon); 

            oclientescon=new cIfxClientesCon[oclientescon.length+1];
            //if(occontmp.length>0)
            CopiarArregloCon(oclientescon,occontmp);
            //oagentes=CopiarArregloCon(occontmp);

            if((oclientescon.length-1)<0)
            {
                nindice=0;
            }
            else
            {
                nindice=(oclientescon.length-1);
            }

            oclientescon[nindice]= new cIfxClientesCon(onuevoskt,this,olog);
            oclientescon[nindice].setLlave(nagentesllave);
            oclientescon[nindice].start();
            
            //ncontadorclientes++;
            nagentesllave++;
        }catch(Exception err)
        {
            olog.outMensaje("cIfxServidor.activarConexionCliente() ERROR :" + err.getMessage());
        }
        
    }
    public void Desconectar()
    {
        conectado=false;
    }
    public synchronized void QuieroSalir(int ncual)
    {
        int z=0;
        int i=0;
        //Al fin no entendi por que putas va con -1
        //oagentesTMP = new cIfxClientesCon[oclientescon.length-1];
        try
        {
        olog.outMensaje("cIfxServidor.QuieroSalir(): Tamaño arreglo : "+oclientescon.length);

        
        oagentesTMP = new cIfxClientesCon[oclientescon.length-1];
        
        for(i=0; i<oclientescon.length;i++)    
        {
            if( oclientescon[i].getLlave() != ncual)
            {
                oagentesTMP[z] = oclientescon[i];
                z++;
                
            }
            
        }
        oclientescon= new cIfxClientesCon[oagentesTMP.length];
        
        CopiarArregloCon(oclientescon,oagentesTMP); 
        }
        catch(Exception err)
        {
            olog.outMensaje("cIfxServidor.QuieroSalir(): ERROR : "+err.toString());
            //olog.outMensaje("cIfxServidor.QuieroSalir(): ERROR : "+err.getMessage());
            olog.outMensaje("cIfxServidor.QuieroSalir(): Tamaño arreglo : "+oclientescon.length);
            olog.outMensaje("cIfxServidor.QuieroSalir(): (i) : "+i);
            olog.outMensaje("cIfxServidor.QuieroSalir(): (z) : "+z);
            olog.outMensaje("cIfxServidor.QuieroSalir(): ERROR DETALLE : "+err.getMessage());
        }
        
    }
 
    //
 
}
